package com.kolon.framework.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.jdom.Document;
import org.jdom.input.SAXBuilder;

import sun.misc.BASE64Encoder;

/**
 * 공통 속성을 얻는 클래스
 * @author stone
 *
 */
public class ComUtil {
	
	/**
	 * 널 체크하는 함수
	 */
	public static String getNullCheck(String str) {
		if (str == null || str.trim().equals(""))
			return "";
		return str;
	}
	
	/**
	 * 널 체크후 널일시 cng 값으로 변환 함수
	 */
	public static String getNullCheck(String str, String cng) {
		if (str == null || str.trim().equals(""))
			return cng;
		return str;
	}
	
	/**
	 * HTTP 프로토콜 커넥션 상태를 얻는 함수
	 */
	public static int getResponseCode(String urlStr, String id, String pw) {
		HttpURLConnection connection = null;
		try {
			URL url = new URL(urlStr);
			connection = (HttpURLConnection)url.openConnection();
			connection.setRequestMethod("GET");
			BASE64Encoder enc = new sun.misc.BASE64Encoder();
			String userpassword = id + ":" + pw;
			String encodedAuthorization = enc.encode( userpassword.getBytes() );
			connection.setRequestProperty("Authorization", "Basic "+encodedAuthorization);
			return connection.getResponseCode();
		} catch (Exception e) {
			return 500;
		} finally {
			if(connection != null) {
				connection.disconnect();
			}
		}
	}
	
	/**
	 * HTTP 프로토콜 커넥션 인증 후 XML 데이터를 얻는 함수
	 */
	public static Document getDocument(String urlStr, String id, String pw) {
		HttpURLConnection connection = null;
		SAXBuilder builder = new SAXBuilder();
		try {
			URL url = new URL(urlStr);
			connection = (HttpURLConnection)url.openConnection();
			connection.setRequestMethod("GET");
			BASE64Encoder enc = new sun.misc.BASE64Encoder();
			String userpassword = id + ":" + pw;
			String encodedAuthorization = enc.encode( userpassword.getBytes() );
			connection.setRequestProperty("Authorization", "Basic "+encodedAuthorization);
			connection.getResponseCode();
			return builder.build(connection.getInputStream());
		} catch (Exception e) {
			return null;
		} finally {
			if(connection != null) {
				connection.disconnect();
			}
		}
	}
	
	/**
	 * HTTP 프로토콜 커넥션 인증 후  텍스트를 얻는 함수
	 */
	public static String getDocumentText(String urlStr, String id, String pw) {
		HttpURLConnection connection = null;
		try {
			URL url = new URL(urlStr);
			connection = (HttpURLConnection)url.openConnection();
			connection.setRequestMethod("GET");
			BASE64Encoder enc = new sun.misc.BASE64Encoder();
			String userpassword = id + ":" + pw;
			String encodedAuthorization = enc.encode( userpassword.getBytes() );
			connection.setRequestProperty("Authorization", "Basic "+encodedAuthorization);
			connection.getResponseCode();
			
			BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream(),"EUC-KR"));
            String line = null;
            String response = "";
            while ((line = rd.readLine()) != null) {
               response += line;
            }
            rd.close();
			return response;
		} catch (Exception e) {
			return null;
		} finally {
			if(connection != null) {
				connection.disconnect();
			}
		}
	}
	
	/**
	 * HTTP 프로토콜 커넥션 후 XML 데이터를 얻는 함수
	 */
	public static Document getDocument(String urlStr) {
		HttpURLConnection connection = null;
		SAXBuilder builder = new SAXBuilder();
		try {
			URL url = new URL(urlStr);
			connection = (HttpURLConnection)url.openConnection();
			connection.setRequestMethod("GET");
			return builder.build(connection.getInputStream());
		} catch (Exception e) {
			return null;
		} finally {
			if(connection != null) {
				connection.disconnect();
			}
		}
	}
	
	/**
	 * int 타입을 String 타입으로 변환
	 * @param i	- 정수
	 * @return
	 */
	public static String iTos(int i){
		return (new Integer(i).toString());
	}
	
	/**
	 * String 타입을 int 타입으로 변환
	 * @param s	- 문자열
	 * @return
	 */
	public static int sToi(String s){
		 try {
			 if(s == null || s.trim().length() == 0) {
				 return 0;
			 } else {
				 return Integer.parseInt(s);
			 }
		 } catch(NumberFormatException numberFormatException) {
			 return 0;
		 } catch(Exception exception) {
			 return 0;
		 }
	 }
	
	/**
	 * Object 타입을 int 타입으로 변환
	 * @param obj	- 오브젝트
	 * @return
	 */
	public static int oToi(Object obj)   {
		try {
			if(obj == null || obj.toString().trim().length() == 0) {
				return 0;
			} else {
				return Integer.parseInt(obj.toString());
			}
		} catch(NumberFormatException numberformatexception) {
			return 0;
		} catch(Exception exception) {
			return 0;
		}
	}

	/**
	 * Object 타입을 int 타입으로 변환
	 * @param obj	- 오브젝트
	 * @return
	 */
	public static String oTos(Object obj)   {
		try {
			if(obj == null || obj.toString().trim().length() == 0) {
				return "";
			} else {
				return obj.toString();
			}
		} catch(Exception e) {
			return "";
		}
	}
	
	/**
	 * 숫자를 해당 자릿수 만큼 앞에 0을 붙여 스트링으로 리턴하는 메소드
	 * @param int	- 값
	 * @param int	- 자릿 수
	 * @return String
	 */
	public static String toZeroStr(int original, int digit){
		String result = "";
		String tr = Integer.toString(original);
		for (int i = 1; i <= (digit - tr.length()); i++) {
			result = result + "0";
		}
		return result + tr;
	}

	/**
	 * 문자열을 substring 할때 해당 target 문자가 Null일경우 substring 하지않고 ""으로 리턴하는 메쏘드
	 * @param String
	 * @param int
	 * @return String
	 */
	public  String toSubString(String str, int beginIndex){
		String ret = null;
		String str_temp = null;
		str_temp = nullChk(str);
		if( "".equals(str_temp) ) {
			 return str_temp;
		} else {
			 ret = str.substring( beginIndex );
			 return ret;
		}
	}

	/**
	 * 문자열을 substring 할때 해당 target 문자가 Null일경우 substring 하지않고 ""으로 리턴하는 메쏘드
	 * @param String
	 * @param str, startIndex, endIndex
	 * @return String
	 */
	public static String toSubString(String str, int beginIndex, int endIndex){
		String ret = null;
		String str_temp = null;
		str_temp = nullChk(str);
		if( "".equals(str_temp) ) {
			 return str_temp;
		} else {
			 ret = str.substring( beginIndex,  endIndex);
			 return ret;
		}
	}
	
	/**
	 * String변수의 글자수를 Max값까지. 그이상 넘어갔을 경우 ..을 붙인후 반환
	 * @param String
	 * @param int
	 * @return String
	 */
	public static String subString(String title, int max) {
		int strlen = max;
		int bylen = 0;
		char c;
		int c_lenc = title.length();
		if (c_lenc > max - 1 ) {
			strlen = 0;
			for (int x = 0 ; bylen < (max - 1) * 2 && strlen < c_lenc ; x++) {
				c = title.charAt(strlen);
				bylen++;
				strlen++;
				if ( c  >  255  || (c > 64 && c < 91)) bylen++;
			}
		}
		if (c_lenc > strlen) {
			title = title.substring(0, strlen) + "..";
		}
		return title;
	}

	/**
	 * String변수의 글자수를 Max값까지. 그이상 넘어갔을 경우 String변수의 값을 붙인후 반환
	 * @param String
	 * @param int
	 * @param String
	 * @return String
	 */
	public static String subString(String title, int max , String type) {
		int strlen = max;		
		int bylen = 0;
		char c;
		int c_lenc = title.length();
		if (c_lenc > max - 1 ) {
			strlen = 0;
			for (int x = 0 ; bylen < (max - 1) * 2 && strlen < c_lenc ; x++) {
				c = title.charAt(strlen);
				bylen++;
				strlen++;
				if ( c  >  255  || (c > 64 && c < 91)) bylen++;
			}
		}
		if(type == null)	type = "..";
		if (c_lenc > strlen) {
			title = title.substring(0, strlen) + type;
		}
		return title;
	}

	/**
	 * 기존의 문자를 새로운 문자로 바꾸는 함수
	 */
	public static String getReplace(String src, String oldstr, String newstr) {
		if (src == null)
			return null;
		StringBuffer dest = new StringBuffer("");
		int len = oldstr.length();
		int srclen = src.length();
		int pos = 0;
		int  oldpos = 0;
		while ((pos = src.indexOf(oldstr, oldpos)) >= 0) {
			dest.append(src.substring(oldpos, pos));
			dest.append(newstr);
			oldpos = pos + len;
		}
		if (oldpos < srclen)
			dest.append(src.substring(oldpos, srclen));
		return dest.toString();
	}
	
	/**
	 * 문자열 NULL 체크 후 NULL일 시 공백으로 반환
	 * @param str	- 문자열
	 * @return
	 */
	public static String nullChk(String str) {
		if(str == null || str.trim().equals("") || "null".equals(str)) return "";
		else return str;
	}
	
	/**
	 * 문자열 NULL 체크 후 NULL일 시 문자열로 반환 
	 * @param str	- 문자열
	 * @param cng	- 대체 문자열
	 * @return
	 */
	public static String nullChk(String str , String cng) {
		if(str == null || str.trim().equals("")) return cng;
		else return str;
	}
	
	/**
	 * 문자열을 enc 변환
	 */
	public static String getEncode(String str, String enc) {
		try{
			return java.net.URLEncoder.encode(str, enc);
		}catch (Exception e){
			return "";
		}
	}
	
	/**
	 * 문자열을 dec 변환
	 */
	public static String getDecode(String str, String dec) {
		try{
			return java.net.URLDecoder.decode(str, dec);
		}catch (Exception e){
			return "";
		}
	}
	
	/**
	 * 앱 OS 체크하는 함수
	 */
	public static String getMobileOS(String str) {
		if (str.indexOf("iPhone") != -1 || str.indexOf("iPod") != -1 || 
				str.indexOf("iPad") != -1 || str.indexOf("Mac OS") != -1 || str.indexOf("CFNetwork") != -1) {
			return "iPhone";
		} else if (str.indexOf("Android") != -1 ) {
			return "Android";
		} else {
			return "iPhone";
		}
	}
	
	public static String getServTp(String str) {
		if ("iPhone".equals(str))
			return "C";
		else if ("Android".equals(str))
			return "B";
		else
			return null;
	}
	
	public static String getFrfTp(String str) {
		if ("A".equals(str))
			return "Web";
		else if ("B".equals(str))
			return "Android";
		else if ("C".equals(str))
			return "iPhone";
		else
			return null;
	}
	
	/**
     * 숫자형의 값을 콤마가 포함된 화폐단위로 리턴
     *
     * @param double dblNumber 바뀌어야할 문자열 값이다.
     * @return String 바뀌어진 값을 넘겨준다.
     */
    public static String addComma(Object obj) {

        String str = "";

        if(obj!=null) {
            str = obj+"";

            if(str.length() <= 3) {
                return str;
            } else {
                StringBuffer sb=new StringBuffer(str);
                int index=-3;

                for(int i=str.trim().length(); i>3; i -= 3)
                {
                    sb.insert(i+index,",");
                }

                String chgStr = sb.toString();

                return chgStr;
            }
        } else {
           // logger.error("DATA가 NULL이군요...");
            return "0";
        }
    }
    
    
    /**
	 * EDITOR가 없는 TextArea의 입력 및 수정값 중 Enter값이나 공백값을 변환
	 * @param String
	 * @return String
	 */
    public static String inputArea(String s) {
		s = getReplace(s, " ", "&nbsp;");
		String result = s.trim();
		result = getReplace(result, "'", "''");
		result = getReplace(result, "\n", "<br>");
		return result;
	}

    /**
     * 두 String 변수의 값이 같다면 true를 반환
     * @param String
     * @param String
     * @return Boolean
     */
    public  boolean stringCompare(String sOne, String sTwo){
  	  if(sOne == null && sTwo == null){ return true; }
  	  if(sOne == null && sTwo != null){ return false; }
  	  if(sOne != null && sTwo == null){ return false; }
  	  if(sOne.equals(sTwo)) return true;
  	  else return false;
    }
}
